package Day005_API02.demo02_BigDecimal类;

/*
    BigDecimal类:
                概述:java.math.BigDecimal 类,无限大的小数
                    用于解决浮点数发生数学运算的精度问题

                构造方法:
                    1.BigDecimal(double val) 将double类型的数据封装为BigDecimal对象
                    2.BigDecimal(String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal
                    注意:推荐使用2.  第一个还是会有精度问题

                成员方法:
                    1.add(BigDecimal value) ，超加法运算
                    2.subtract(BigDecimal value) ，减法运算
                    3.multiply(BigDecimal value) ，乘法运算
                    4.divide(BigDecimal value) ，除法运算

                注意:
                    除不尽时,系统不知道要保留多少位,会运行异常
                    (divide有6个重载方法)
                解决:
                    可以使用divide方法的另一个重载方法；BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode):
                    divisor：除数对应的BigDecimal对象； 参数说明：scale:精确的位数；roundingMode取舍模式
                    RoundingMode: 枚举;  BigDecimal.ROUND_HALF_UP 四舍五入
 */

import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {

        //浮点数发生数学运算的精度问题
        //System.out.println(0.09 + 0.01);// 0.09999999999999999
        //System.out.println(1.0 - 0.32);//  0.6799999999999999
        //System.out.println(1.015 * 100);// 101.49999999999999
        //System.out.println(1.301 / 100);// 0.013009999999999999

        //BigDecimal构造方法
        //字符串形式
        BigDecimal bd1 = new BigDecimal("0.09");
        BigDecimal bd2 = new BigDecimal("0.01");
        //double形式 不用!
        BigDecimal bd3 = new BigDecimal(0.09);
        BigDecimal bd4 = new BigDecimal(0.01);

        //BigDecimal成员方法
        //1.+
        System.out.println(bd1.add(bd2)); // 0.10
        System.out.println(bd3.add(bd4)); // 0.09999999999999999687749774324174723005853593349456787109375

        //2.-
        System.out.println(bd1.subtract(bd2)); // 0.08

        //3.*
        System.out.println(bd1.multiply(bd2)); // 0.0009

        //4./
        System.out.println(bd1.divide(bd2)); // 9

        //注意:******************************************
        //除得尽
        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("2");
        System.out.println(b1.divide(b2)); // 5
        //除不尽
        BigDecimal b3 = new BigDecimal("10");
        BigDecimal b4 = new BigDecimal("3");
        //System.out.println(b1.divide(b2)); // 系统不知道要保留多少位,会运行异常
        double d1 = 10;
        double d2 = 3;
        System.out.println(d1/d2); //3.3333333333333335

        //解决办法
        //BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
        System.out.println(b3.divide(b4, 2, BigDecimal.ROUND_HALF_UP)); // 3.33
        System.out.println(b3.divide(b4, 5, BigDecimal.ROUND_HALF_UP)); // 3.33333
    }
}
